物件和陣列的相等性:
const obj1 = {};
const obj2 = obj1;
console.log(obj1 === obj2); // true
console.log({} === {}); // false
解釋:即使 arr1
和 arr2
看起來都是空的陣列,它們在記憶體中指向不同的位置,所以它們不相等。
浮點數的特殊情況:
console.log(0.1 + 0.2 === 0.3); // false
解釋:由於浮點數的運算誤差,0.1 + 0.2
的結果並不完全等於 0.3
。
NaN 的特性:
console.log(NaN === NaN); // false
解釋:根據 IEEE 標準,NaN 不等於任何值,包括其本身。
隱式類型轉換:
console.log([] + []); // ""
console.log([] + {}); // "[object Object]"
console.log({} + []); // 0
解釋:JavaScript 會嘗試將運算元轉換為合適的類型來執行操作,這可以導致一些意想不到的結果。
真值轉換:
console.log(!![]); // true
console.log(!!{}); // true
console.log(!!"false"); // true
解釋:即使某些值在其他語言中可能被視為假值(falsy),但在 JavaScript 中它們會被轉換為 真值(truthy)。
null
和 undefined
的比較:
console.log(null == undefined); // true
console.log(null === undefined); // false
解釋:使用 ==
時,null
和 undefined
被認為是相等的,但使用嚴格相等 ===
時,它們是不相等的。
一個數字與一個字串相加:
console.log(4 + "7"); // "47"
console.log(4 * "7"); // 28
解釋:當使用 +
運算子時,如果一個運算元是字串,那麼另一個運算元會被轉換為字串。但其他算數運算子會嘗試將字串轉換為數字。
數值字串與布林值的運算:
console.log('5' - true); // 4
解釋:在這種情況下,字串 '5'
和布林值 true
都被轉換為數字進行運算。
對象的奇怪行為:
const obj = {};
obj[true] = "true";
obj[false] = "false";
console.log(obj[1]); // "true"
console.log(obj['true']); // "true"
解釋:當使用非字串作為物件的鍵時,它會被轉換為字串。
一個數字前的加號:
console.log(+'3'); // 3
解釋:前面的 +
是一種簡潔的方法來將字串轉換為數字。
每當我開始撰寫 JavaScript 的深海中,總會感到自己的渺小,畢竟每次撰寫都會發現意想不到和難以解釋的現象,這種神奇的現象有時候是令人驚喜的,但更多的時候是挫敗與疑惑居多。從 [] + [] = “” 開始,我總覺得 JavaScript 的內部系統總會有意的領我們前往一片未知的領域。
然而,就在我快被這些混沌的規則給一巴掌打死的時候, TypeScript 的出現,它如同救生員一樣,把我拯救出來。全靠著 TypeScript 最強大的類型檢查系統,如同救生圈一樣,適時的解救我。在寫專案的過程中就能發現淺伏期的問題,不必等到程式運行時候才發現。
結論:不可不用的 TypeScript :)